-
Notifications
You must be signed in to change notification settings - Fork 757
[cssom-view-1] Added definition of getBoxQuads() #10538
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
One issues atm: |
|
I think it makes more sense to add another option to I imagine something like Sebastian |
should be fixed in current polyfill |
it's in a extra method, cause it is used from other functions in the spec (like convertPointFromNode). And convertPointFromNode use it multiple times |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, this looks like a good start. Please look at how other specs (specially recent ones) use bikeshed in order to get the formatting and references correct. Also this needs to work in terms of nodes and boxes, not elements.
cssom-view-1/Overview.bs
Outdated
|
|
||
| The <dfn method for=GeometryUtils lt="getBoxQuads(options)|getBoxQuads()">getBoxQuads(<var>options</var>)</dfn> method must run the following steps: | ||
|
|
||
| The helper method getCompleteTransform(anchestor) must run the following steps: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You need to get the element as a parameter, and use <div algorithm> for this for example:
<div algorithm="get the complete transform">
In order to <dfn export>get the complete transform</dfn> of an node <var>node</var> relative to a node <var>ancestor</ancestor> ...
</div>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added node to helper function
cssom-view-1/Overview.bs
Outdated
|
|
||
| test block in inline | ||
| 1. let currentElement be the element getCompleteTransform() called on. | ||
| 2. let transformationMatrix be the current transformation matrix of currentElement (https://www.w3.org/TR/css-transforms-2/#ctm) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please use bikeshed references for this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where should I use a bikeshed reference? (Is there an editor wich helps in editing bs files)
cssom-view-1/Overview.bs
Outdated
|
|
||
| <ol> | ||
| <li><p class=issue>... | ||
| 1. get the resulting matrix between the element and the document.defaultView via the algorithm defined in getCompleteTransform |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All these algorithms need to be in terms of nodes, as GeometryUtils also applies to text nodes and such.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| - 'border': no change | ||
| - 'margin': x - margin.left, y - margin.top | ||
| - 'padding': x + border.leftWidth, y + border.topWidth | ||
| - 'content': x + border.leftWidth + padding.left, y + border.topWidth + padding.top |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not actually based on the computed style but on the actual used padding box etc. Those boxes are defined already elsewhere and we should reuse the definitions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't really find where I should link to.
maybe: https://drafts.csswg.org/css2/#Computing_widths_and_margins
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't really find where I should link to. maybe: https://drafts.csswg.org/css2/#Computing_widths_and_margins
Pretty sure those boxes are defined here: https://drafts.csswg.org/css-box-4/#box-edges
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, but I need to link to the Algorythm how they are calculated, or is this enough?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, but I need to link to the Algorythm how they are calculated, or is this enough?
There is no algorithm like that for these. They are defined in English instead. Browsers have algorithms internally that match those descriptions and can call into those when a spec says to do something with one of these boxes, so linking to their definitions is enough to unambiguously tell an implementer what needs to happen.
More modern specs like to define their concepts in terms of algorithms to derive them, because that makes implementation easier and leaves less room for creative (mis-)interpretation of the definition.
TL;DR: You want to link to a concept's definition when using it. Whether that is an algorithm or not doesn't matter.
|
Hi @jogibear9988, would you maybe have the time to follow-up on the review from Emilio? Thanks |
|
@emilio |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This still needs a bit of work to get the spec into a reasonable shape, but looks in the right direction. Thanks!
| points are flattened (3d transform), z=0. like getClientRect | ||
|
|
||
| test block in inline | ||
| 1. let currentElement be node. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
currentNode, right? I think this should use <var>current</var> and other bikeshed markup to display properly.
| 1. let currentElement be node. | ||
| 2. let transformationMatrix be the current transformation matrix of currentElement (https://www.w3.org/TR/css-transforms-2/#ctm) | ||
| 3. while currentElement is not null do | ||
| <ol> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you really need the <ol>?
|
|
||
| The <dfn method for=GeometryUtils lt="getBoxQuads(options)|getBoxQuads()">getBoxQuads(<var>options</var>)</dfn> method must run the following steps: | ||
|
|
||
| The helper method getCompleteTransform(node, anchestor) must run the following steps: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you should probably add a <dfn> so that you can reference this properly elsewhere.
|
|
||
| viewport boxes are all the same | ||
| <ol> | ||
| 1. create an array as result container |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let |result| be an empty [=list=] of [=DOMQuad=] objects. etc, please look at existing bikeshed files to see how to make this work.
| viewport boxes are all the same | ||
| <ol> | ||
| 1. create an array as result container | ||
| 2. for each css-fragment of the element run the following steps |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
of what element? Probably of this? Also fragment should link to a definition.
| - 'padding': https://drafts.csswg.org/css-box-4/#box-edges - use the padding-box | ||
| - 'content': https://drafts.csswg.org/css-box-4/#box-edges - use the content-box | ||
| 3. create a DomQuad from the rect via DOMQuad.fromRect | ||
| 4. Calculate the resulting transformation matrix between the element and options.realtiveTo (if relativeTo is unset use window.defaultView) via the algorithm defined in getCompleteTransform |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
window.defaultView is not a thing, also s/realtiveTo/relativeTo.
This should be untransforming the rect to the layout viewport if there's no relativeTo.
|
|
||
| <ol> | ||
| <li><p class=issue>... | ||
| 1. transform each point of the DOMQuad via convertPointFromNode |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should link to convertPointFromNode, but also probably should have more precise details like:
* Let <var>p1</var> be the result of calling [=convertFromFromNode=] with <var>quad</var>.p1, <var>from</var> and <var>options</var>.
* ...
* Return a new [=DOMQuad=] with <var>p1</var>...
|
|
||
| <ol> | ||
| <li><p class=issue>... | ||
| 1. get the resulting matrix between the node and the document.defaultView via the algorithm defined in getCompleteTransform |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Give these meaningful names like:
* Let <var>thisTransformToViewport</var> be the result of calling [=getCompleteTransform=] with <var>this</var> and <var>this</var>' [=associated document=].
* Let <var>fromTransformToViewport</var> be the result of ...
* Invert <var>fromTransformToViewport</var>.
* ...
Then reference those.
| - 'border': no change | ||
| - 'margin': x - margin.left, y - margin.top | ||
| - 'padding': x + border.leftWidth, y + border.topWidth | ||
| - 'content': x + border.leftWidth + padding.left, y + border.topWidth + padding.top |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same, refer to standard terms. It seems ResizeObserver refers to the CSS2 border box area, etc.
| 1. get the resulting matrix between the node and the document.defaultView via the algorithm defined in getCompleteTransform | ||
| 2. get the resulting matrix between the from and the document.defaultView via the algorithm defined in getCompleteTransform | ||
| 3. inverse the matrix in 2. | ||
| 4. Depending on the value of options.fromBox modify the point with the calculated style values of the element. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should use <var>point</var> etc.
|
Hi @jogibear9988. Would you maybe have the time to update this PR based on the review feedback from Emilio? Thanks a lot! |
|
Sorry, I've read them, and hopefully fix in the next days |
|
Hi @jogibear9988. I wanted to check back with you about the status of this PR. Is it still something you can continue working on? Thanks! |

Fixes #10537
A linked issue:
#10514
A firefox issue with a little bit of description:
https://bugzilla.mozilla.org/show_bug.cgi?id=1107559
A polyfill for the API
https://github.com/jogibear9988/getBoxQuadsPolyfill